# -*- coding: utf-8 -*-

 ###############################################
 ##                                             ##
 ##   sqlite backend                             ##
 ##                                              ##
 ##   for Empresa basica                         ##
 ##                                              ##
 ##   by Críptidos Digitales                     ##
 ##   GPL (c)2008                                ##
  ##                                             ##
    ###############################################


# import sys, os
# from decimal import Decimal as dec
import datetime

import sqlalchemy

from sqlalchemy import Table, Column, Index, Date, DateTime, Integer, Numeric, String, Unicode, UniqueConstraint, ForeignKey



metadata = sqlalchemy.MetaData()


atributos = Table('atributos', metadata,
    Column('id', Integer, primary_key=True),
    Column('code', Integer),
    Column('grupo', Unicode),
    Column('nombre', Unicode),
    Column('valor', Unicode, default=u''),
    Column('referencia', Unicode, default=u''),
    UniqueConstraint('code', 'grupo'),
    UniqueConstraint('grupo', 'nombre'))


entidades = Table('entidades', metadata,
    Column('id', Integer, primary_key=True),
    Column('personalidad', Integer),
    Column('nombre', Unicode),
    Column('nombre2', Unicode), # apellidos para personas fisicas, vacío para morales
    Column('alias', Unicode),
    Column('fechanacimiento', Date),
    Column('rfc', Unicode),
    Column('curp', Unicode))


operaciones = Table('operaciones', metadata,
    Column('operacion_id', Integer, primary_key=True),
    Column('operacion_tipo', Unicode),
    Column('cuenta', Unicode),
    Column('fecha', DateTime),
    Column('fecha2', DateTime),
    Column('monto', Numeric(12, 4)),
    Column('status', Unicode),
    Column('referencia', Unicode),
    Column('comentarios', Unicode))


roles = Table('roles', metadata,
    Column('id', Integer, primary_key=True),
    Column('code', Integer),
    Column('entidad_id', Integer, ForeignKey('entidades.id')),
    Column('tipo_id', Integer, ForeignKey('atributos.id')),
    Column('funcion', Unicode),         # OBSOLETO, USAR ATRIBUTOROL
    Column('comentarios', Unicode, default=u''),
    Column('dato1', Unicode, default=u''),
    Column('dato2', Unicode, default=u''),
    UniqueConstraint('code', 'tipo_id'))


atributosrol = Table('atributosrol', metadata,
    Column('id', Integer, primary_key=True),
    Column('rol_id', Integer, ForeignKey('roles.id')),
    Column('nombre', Unicode),
    Column('valor', Unicode),
    Column('referencia', Unicode),
    Column('usuario', Unicode))


direcciones = Table('direcciones', metadata,
    Column('id', Integer, primary_key=True),
    Column('rol_id', Integer, ForeignKey('roles.id')),
    Column('tipo', Unicode),                          # "personal", "trabajo"
    Column('lugar_id', Integer, ForeignKey('atributos.id')),
    Column('areanominal', Unicode),                   # Colonia
    Column('areapostal', Unicode),                    # Código Postal
    Column('areatelefonia', Unicode),                 # Código de área telefónica
    Column('calle', Unicode),                         # Calle, número e interior
    Column('status', Unicode)
    )


productos = Table('productos', metadata,
    Column('id', Integer, primary_key=True),            # inmutable
    Column('upc', String),
    Column('tipo_id', Integer, ForeignKey('atributos.id')),
    Column('clasificacion_id', Integer, ForeignKey('atributos.id')),
    Column('unidad_id', Integer, ForeignKey('atributos.id')),
    Column('costopromedio', Numeric),
    Column('margen', Numeric),
    Column('impuesto', Numeric),
    Column('precio', Numeric),      # Para obtener este valor, además del costo y margen
                                    # se usan otros datos, como el redondeo.
    Column('minimo', Numeric),
    Column('maximo', Numeric),
    Column('actual', Numeric),
    Column('fechaalta', DateTime),
    Column('fechabaja', DateTime),
    Column('status', Unicode)
    )


atributosproducto = Table('atributosproducto', metadata,
    Column('id', Integer, primary_key=True),
    Column('producto_id', Integer, ForeignKey('productos.id')),
    Column('nombre', Unicode),
    Column('valor', Unicode),
    Column('factor1', Unicode, default=u''),
    Column('factor2', Unicode, default=u''),
    Column('referencia', Unicode, default=u''),
    Column('atributo_id', Integer, ForeignKey('atributos.id')),
    Column('usuario', Integer, ForeignKey('roles.id')),
    Column('status', Unicode),
    Column('fechaalta', DateTime),
    Column('fechabaja', DateTime)
    )

acepciones = Table('acepciones', metadata,
    Column('id', Integer, primary_key=True),
    Column('producto_id', Integer, ForeignKey('productos.id')),
    Column('rol_id', Integer, ForeignKey('roles.id')),
    Column('codigo', Unicode),
    Column('nombre', Unicode),
    Column('costo', Numeric),
    Column('descuentoindividual', Numeric, default=u'0'),
    Column('descuentogeneral', Numeric, default=u'0'),
    Column('referencia', Unicode),
    Column('status', Unicode, default=u'actual', index=True),
    Column('fechaalta', DateTime),
    Column('fechabaja', DateTime),
    UniqueConstraint('producto_id', 'rol_id', 'status', 'fechaalta')
    )


archivosproducto = Table('archivosproducto', metadata,
    Column('id', Integer, primary_key=True),
    Column('producto_id', Integer, ForeignKey('productos.id')),
    Column('atributo', String(10)),
    Column('valor', String(15)),
    Column('fecha', DateTime)
    )


procesos = Table('procesos', metadata,
    Column('proceso_id', Integer, primary_key=True),
    Column('tipo', Unicode),
    Column('fecha', DateTime),
    Column('status', Unicode),
    Column('reference', Integer, ForeignKey('procesos.proceso_id'))
    )


documentos = Table('documentos', metadata,
    Column('documento_id', Integer, primary_key=True),
    Column('tipo_id', Integer, ForeignKey('atributos.id')),
    Column('folio', Unicode),
    Column('fecha', Date),
    Column('rol_id', Integer, ForeignKey('roles.id')),
    Column('subtotal', Numeric),
    Column('descuento', Numeric),
    Column('descuentoporcentaje', Numeric),
    Column('impuesto', Numeric),
    Column('impuestoporcentaje', Numeric),
    Column('total', Numeric),
    Column('status', Unicode),
    Column('referencia', Unicode),
    Column('fechaalta', DateTime)
    )


operaciones_documentos = Table('operaciones_documentos', metadata,
    Column('operacion_id', Integer, ForeignKey('operaciones.operacion_id')),
    Column('documento_id', Integer, ForeignKey('documentos.documento_id'))
    )


atributosdocumento = Table('atributosdocumento', metadata,
    Column('id', Integer, primary_key=True),
    Column('documento_id', Integer, ForeignKey('documentos.documento_id')),
    Column('nombre', Unicode),
    Column('valor', Unicode),
    Column('referencia', Unicode),
    Column('usuario', Integer, ForeignKey('roles.id')),
    Column('status', Unicode),
    Column('fechaalta', DateTime),
    Column('fechabaja', DateTime)
    )

partidasdocumento = Table('partidasdocumento', metadata,
    Column('id', Integer, primary_key=True),
    Column('documento_id', Integer, ForeignKey('documentos.documento_id')),
    Column('producto_id', Integer, ForeignKey('productos.id')),
    Column('cantidad', Numeric),
    Column('costo', Numeric),
    Column('precio', Numeric),
    Column('descuento', Numeric),
    Column('impuesto', Numeric),
    Column('precioneto', Numeric),
    Column('status', Unicode)
    )


proceso_operacion = Table('proceso_operacion', metadata,
    Column('proceso_id', Integer, ForeignKey('procesos.proceso_id')),
    Column('operacion_id', Integer, ForeignKey('operaciones.operacion_id')))
Index('idx_proceso_operacion', proceso_operacion.c.proceso_id, proceso_operacion.c.operacion_id)
Index('idx_operacion_proceso', proceso_operacion.c.operacion_id, proceso_operacion.c.proceso_id)


# servicios = Table('servicios', metadata,
    # Column('id', Integer, primary_key=True),
    # Column('documento_id', Integer, ForeignKey('documentos.documento_id')),
    # Column('equipo_id', Integer, ForeignKey('equipos.id')),
    # Column('nivel1', Unicode),
    # Column('nivel2', Unicode),
    # Column('accesorios', Unicode),
    # Column('observaciones', Unicode),
    # Column('sintomas', Unicode),
    # Column('fechadiagnostico', DateTime),
    # Column('tecnico_id', Integer, ForeignKey('roles.id')),
    # Column('diagnostico', Unicode)
    # )

# equipos = Table('equipos', metadata,
    # Column('id', Integer, primary_key=True),
    # Column('propietario_id', Integer, ForeignKey('roles.id')),
    # Column('codigo', Unicode),
    # Column('tipo_id', Integer),
    # Column('marca_id', Integer),
    # Column('linea_id', Integer),
    # Column('modelo_id', Integer),
    # Column('serie', String),
    # Column('registro', Unicode),
    # Column('color', Unicode),
    # Column('observaciones', Unicode)
    # )


if __name__ == "__main__":
    print (3232)

    createSession('EB2')

    # inicializa()

    print session

    registros = session.query(Proceso).all()

    print registros

